package com.example.uitl;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;

public class JMArith {
	public static void main(String[] args) {
	    String val = "12345";
	    String result=encrypt(val);
	    System.out.println(result);
	    String rawdata=decrypt(val);
	    System.out.println(rawdata);
	}  
	  
	/** 
	 * 数字 0 1 2 3 4 5 6 7 8 9 
	 * 字母 b a c g h k o w q p 
	 * @param val 
	 * @return 数字转字母 
	 */  
	public static String getPhoneStr(String val) {
	    String returnStr = "";
	    if (val != null && val.length() > 0) {  
	        byte[] obj = val.getBytes();  
	        for (int i = 0; i < obj.length; i++) {  
	            returnStr += getLetter(String.valueOf(val.charAt(i)));
	        }  
	    }  
	    return returnStr;  
	}  
	   /** 
	    * 字母转数字 
	    * 字母 b a c g h k o w q p 
	    * 数字 0 1 2 3 4 5 6 7 8 9 
	    * @param val 
	    * @return 
	    */  
	public static String getPhoneNum(String val){
	    String returnStr = "";
	    if (val != null && val.length() > 0) {  
	        byte[] obj = val.getBytes();  
	        for (int i = 0; i < obj.length; i++) {  
	            returnStr += getMapData().get(String.valueOf(val.charAt(i)));
	        }  
	    }  
	    return returnStr;  
	}  
	  
	  
	  
	  
	/*** 
	 * 换位号码中两组数字：第1位和第5位交换，第2位和第4位交换，位数号按从左往右数 
	 */  
	public static String changeNum(String val){
	      
	    if(!JMArith.isEmpty(val)){  
	        String str="";
	        char [] phone=val.toCharArray();  
	        for(int i=0;i<phone.length;i++){  
	            if(i==0||i==1||i==2||i==3){  
	                if(i==0)  
	                    str+=phone[3];  
	                if(i==1)  
	                    str+=phone[2];  
	                if(i==2)  
	                    str+=phone[1];  
	                if(i==3)  
	                    str+=phone[0];  
	            }else{  
	                str+=phone[i];  
	            }  
	        }  
	        return str;  
	    }  
	    return val;  
	}  
	  
	/** 
	 * 通过Map值获取key 
	 * @return 
	 */  
	public static String getLetter(String val) {
	    for(Entry<String,String> entry:getMapData().entrySet()){
	        if(val.equals(entry.getValue()))  
	           return String.valueOf(entry.getKey());
	    }  
	    return val;  
	}  
	  
	/** 
	 * 字母 b a c g h k o w q p 
	 * 数字 0 1 2 3 4 5 6 7 8 9 
	 * @return Map 
	 */  
	public static Map<String,String> getMapData(){
	    Map<String,String> map = new HashMap<String,String>();
	        map.put("b","0");  
	        map.put("a","1");  
	        map.put("c","2");  
	        map.put("g","3");  
	        map.put("h","4");  
	        map.put("k","5");  
	        map.put("o","6");  
	        map.put("w","7");  
	        map.put("q","8");  
	        map.put("p","9");
	        map.put("\\","\\");
	        map.put("/","/");
	        map.put("-","-");
	    return map;  
	}  
	  
	/** 
	 * 去除所有数字 
	 */  
	public static String removeNum(String val){
	    return val.replaceAll("\\d+","");  
	}  
	  
	  
	/** 
	 * 随机插入3个数字 
	 */  
	public static String insertNum(String val){
	    String num=radomNum(3);
	    //往指定长度字符串加入随机数字  
	    for(int i=0;i<num.length();i++){  
	        Integer inNum= Integer.parseInt(radomNum(1));
	        String result=val.substring(0,inNum>val.length()?val.length():inNum)+num.charAt(i)+val.substring(inNum>val.length()?val.length():inNum,val.length());
	        val=result;  
	    }  
	    return val;  
	}  
	  
	  
	/** 
	 * 随机生成i位数字 
	 * i<10 
	 */  
	public static String radomNum(int i){
	    Random random = new Random();
	    String val=String.valueOf(random.nextInt());
	    return val.substring(0,i).indexOf("-")>-1?radomNum(i):val.substring(0,i);  
	}  
	  
	  
	/** 
	 * ：加密步骤： 
	 * 1、换位号码中两组数字：第1位和第5位交换，第2位和第4位交换 
	 * 2、将全部号码转换为对应的字符 
	 * 3、任意位置插入三个随机数字 
	 * @return 
	 */  
	public static String encrypt(String phoneStr){
	    //1.换位号码中两组数字：第1位和第5位交换，第2位和第4位交换  
	    phoneStr=changeNum(phoneStr);  
	    //2.将全部号码转换为对应的字符  
	    phoneStr=getPhoneStr(phoneStr);  
	    //3.任意位置插入三个随机数字  
	    phoneStr=insertNum(phoneStr); 
	    if(phoneStr.length() > 20){
	    	phoneStr = removeNum(phoneStr);
	    }
	    return phoneStr;  
	}  
	  
	  
	/** 
	 * ：解密步骤： 
	 * 1去除所有数字 
	 * 2将剩余字母全部转换为对应的数字 
	 * 3换位号码中两组数字：第1位和第5位交换，第2位和第4位交换 
	 * @return 
	 */  
	public static String decrypt(String phoneStr){
	    if(!JMArith.isNumber(phoneStr)){  
	        //去除所有数字  
	        phoneStr=removeNum(phoneStr);  
	        //将剩余字母全部转换为对应的数字  
	        phoneStr=getPhoneNum(phoneStr);  
	        //换位号码中两组数字：第1位和第5位交换，第2位和第4位交换  
	        phoneStr=changeNum(phoneStr);  
	    }  
	    return phoneStr;  
	}  
	  
	        
	  
	   /** 
	    * 正则表达式数字验证 
	    *  
	    * @author crab 
	    * @param str 
	    * @return 
	    */  
	   public static boolean isNumber(String str) {
	       if (str != null && !str.equals("")) {  
	           java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("[0-9]*");  
	           java.util.regex.Matcher match = pattern.matcher(str);  
	           return match.matches();  
	       } else {  
	           return false;  
	       }  
	   }  
	  
	   /** 
	    * 字符串非空非null判断 crab 
	    */  
	   public static boolean isEmpty(String val) {
	       if (val == null || val.equals("") || val.equalsIgnoreCase("null")) {  
	           return true;  
	       } else {  
	           return false;  
	       }  
	   } 
	
	
}